from typing import Any, Dict, Optional


class Edge:
    """
    图边模型类（单一职责：表达流程图中从 source 节点到 target 节点的连线关系）。
    
    Attributes:
        id (str): 边的唯一标识符
        source (str): 源节点 ID
        target (str): 目标节点 ID
        source_handle (Optional[str]): 源节点的分支/句柄标识（如条件分支 ID），None 表示默认分支
        data (Dict[str, Any]): 边的附加配置或元数据
    """
    # 属性类型注解（便于 IDE 与静态分析）
    id: str
    source: str
    target: str
    source_handle: Optional[str]
    data: Dict[str, Any]

    def __init__(self, id: str, source: str, target: str, source_handle: Optional[str] = None, data: Optional[Dict[str, Any]] = None):
        """
        初始化边对象。
        
        Args:
            id (str): 边的唯一标识符
            source (str): 源节点 ID
            target (str): 目标节点 ID
            source_handle (Optional[str]): 源节点分支句柄（如条件分支 ID），None 表示默认分支
            data (Optional[Dict[str, Any]]): 边的附加配置
        """
        self.id = id
        self.source = source
        self.target = target
        self.source_handle = source_handle
        self.data = data or {}

    @staticmethod
    def from_dict(e: Dict[str, Any]) -> 'Edge':
        """
        从原始字典创建 Edge 实例。
        
        Args:
            e (Dict[str, Any]): 原始边配置（通常来自流程 JSON 配置）
        
        Returns:
            Edge: 构造完成的边对象
        """
        return Edge(
            id=str(e.get('id') or '').strip(),
            source=str(e.get('from') or e.get('source') or '').strip(),
            target=str(e.get('to') or e.get('target') or '').strip(),
            source_handle=e.get('sourceHandle'),
            data=e.get('data') or {}
        )